package Interface.Player;

import Interface.JSelect;
import Jastermind.Data;
import Jastermind.Player;
import Various.Tools;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import Various.SerialisationXML;

public class JPanelPlayerSettings extends JPanel {

    private JSelect selectCombinaisonSize;;
    private JSelect selectNbEssais;
    private JSelect selectNbOccurence;
    private JButton jbtColorBienPlace;
    private JButton jbtColorMalPlace;
    private Player player;
    private JButton jbtSauvegarder;

    public JPanelPlayerSettings(Player joueur) {
        super();
        this.setLayout(null);
        this.setOpaque(false);
        this.player=joueur;

        //*********************** Dimension***********************
        //En cas d'évolution de taille
        int jElementWidth = 150;
        int jElementHeight = 20;
        int posYStart = 60;
        int yInterval = 30;
        int posXLabel = 40;
        int posXField = posXLabel + jElementWidth;

        //*********************** Titre ***********************

        JLabel jblTitre = new JLabel("Paramètres du joueur " + joueur.getName());
        jblTitre.setBounds(125, 30, 200, 20);
        this.add(jblTitre);
         //*********************** Taille combinaison ***********************
         //Label taille combinaison
        JLabel jblCombinaisonSize = new JLabel("Taille de la combinaison : ");
        jblCombinaisonSize.setBounds(posXLabel, posYStart, jElementWidth, jElementHeight);
        this.add(jblCombinaisonSize);

        //Select taille combinaison
        selectCombinaisonSize = new JSelect("");
        selectCombinaisonSize.setNbCombinaison();
        selectCombinaisonSize.setSelectedItem(joueur.getCombinaisonSize());
//        selectCombinaisonSize.setEnabled(false);
        selectCombinaisonSize.setBounds(posXField + 100, jblCombinaisonSize.getY(), jElementWidth - 100, jElementHeight);
        selectCombinaisonSize.addItemListener(new ActionPlayerSettings());
        this.add(selectCombinaisonSize);

        //*********************** Nombre d'essais ***********************

        //Label nbessai
        JLabel jblNbEssai = new JLabel("Nombre d'essais : ");
        jblNbEssai.setBounds(posXLabel, jblCombinaisonSize.getY()+yInterval, jElementWidth, jElementHeight);
        this.add(jblNbEssai);

        //Select nbessai
        selectNbEssais = new JSelect("");
        selectNbEssais.setNbEssais();
        selectNbEssais.setSelectedItem(joueur.getNbEssais());
        selectNbEssais.setBounds(posXField + 100, jblNbEssai.getY(), jElementWidth - 100, jElementHeight);
        selectNbEssais.addItemListener(new ActionPlayerSettings());
        this.add(selectNbEssais);

        //*********************** NbOccurence ***********************

        //Label nbessai
        JLabel jblNbOccurence = new JLabel("Occurence max d'une couleur : ");
        jblNbOccurence.setBounds(posXLabel, jblNbEssai.getY() + yInterval, jElementWidth + 50, jElementHeight);
        this.add(jblNbOccurence);

        //Select nbessai
        selectNbOccurence = new JSelect("");
        selectNbOccurence.setNbOccurences(joueur);
        selectNbOccurence.setSelectedItem(joueur.getNbOccurence());
        selectNbOccurence.setBounds(posXField + 100, jblNbOccurence.getY(), jElementWidth - 100, jElementHeight);
        selectNbOccurence.addItemListener(new ActionPlayerSettings());
        this.add(selectNbOccurence);

        //*********************** Liste Colors ***********************

        //Label nbColors
        JLabel jblNbColors = new JLabel(joueur.getListColors().size() + " couleurs disponibles : ");
        jblNbColors.setBounds(posXLabel, jblNbOccurence.getY() + yInterval, jElementWidth + 50, jElementHeight);
        this.add(jblNbColors);

        //Add color
        JButton jbtAddJoueur = new JButton(new ImageIcon("./images/add.jpg"));
        jbtAddJoueur.setBackground(Color.WHITE);
        jbtAddJoueur.setToolTipText("Ajouter une couleur");
        jbtAddJoueur.setActionCommand("addColor");
        jbtAddJoueur.setBounds(posXField - 30 + (jElementWidth + 5) / 2, jblNbColors.getY(), 30, jElementHeight);
        jbtAddJoueur.addActionListener(new ActionPlayerSettings());
        this.add(jbtAddJoueur);

        //Liste couleur
        JPanel jpListeColors = new JPanel();
        jpListeColors.setOpaque(false);
        jpListeColors.setBounds(posXField + (jElementWidth + 5) / 2, jblNbColors.getY(), (jElementWidth + 5) / 2, jElementHeight);
        jpListeColors.setLayout(new GridLayout(2,6));
          for (int iColor = 0; iColor < joueur.getListColors().size(); iColor++) {
            JLabel jblColor = new JLabel();
            jblColor.setOpaque(true);
            jblColor.setBackground(joueur.getListColors().get(iColor));
            jpListeColors.add(jblColor);
        }
        this.add(jpListeColors);

        //**************************************Couleur bien placée*******************************

        //Label Couleur bien placée
        JLabel jblBienPlace = new JLabel("Couleur bien placé : ");
        jblBienPlace.setBounds(posXLabel, jblNbColors.getY() + yInterval, jElementWidth - 30, jElementHeight);
        this.add(jblBienPlace);

        //Couleur bien placée
        jbtColorBienPlace = new JButton();
        jbtColorBienPlace.setOpaque(true);
        jbtColorBienPlace.setBorder(BorderFactory.createLineBorder(Color.black));
        jbtColorBienPlace.setBounds(posXLabel + jElementWidth - 30, jblBienPlace.getY(), 20, jElementHeight);
        jbtColorBienPlace.setActionCommand("bienPlace");
        jbtColorBienPlace.addActionListener(new ActionPlayerSettings());
        jbtColorBienPlace.setBackground(joueur.getBienPlace());
        this.add(jbtColorBienPlace);

        //**************************************Couleur bien placée*******************************

        //Label Couleur bien placée
        JLabel jblMalPlace = new JLabel("Couleur mal placé : ");
        jblMalPlace.setBounds(posXField, jblNbColors.getY() + yInterval, jElementWidth - 30, jElementHeight);
        this.add(jblMalPlace);

        //Couleur bien placée
        jbtColorMalPlace = new JButton();
        jbtColorMalPlace.setOpaque(true);
        jbtColorMalPlace.setBorder(BorderFactory.createLineBorder(Color.black));
        jbtColorMalPlace.setBounds(posXField + jElementWidth - 30, jblMalPlace.getY(), 20, jElementHeight);
        jbtColorMalPlace.setActionCommand("malPlace");
        jbtColorMalPlace.addActionListener(new ActionPlayerSettings());
        jbtColorMalPlace.setBackground(joueur.getMalPlace());
        this.add(jbtColorMalPlace);

        //Button Sauvegarder
        jbtSauvegarder = new JButton("Sauvegarder paramètres");
        jbtSauvegarder.setToolTipText("Enregistrer les paramètres du joueur");
        jbtSauvegarder.setBounds(110, jbtColorMalPlace.getY() + yInterval ,180, 30);
        jbtSauvegarder.setActionCommand("Sauvegarder");
        jbtSauvegarder.setEnabled(false);
        jbtSauvegarder.addActionListener(new ActionPlayerSettings());
        this.add(jbtSauvegarder);

    }

    public JButton getJbtSauvegarder() {
        return jbtSauvegarder;
    }
    
    private class ActionPlayerSettings implements ActionListener, ItemListener {

        public void actionPerformed(ActionEvent e) {
            if(e.getActionCommand().equals("Sauvegarder")){
                SerialisationXML.saveToXml(Player.getFileName(),Data.getUniqueInstance().getListPlayers());
                jbtSauvegarder.setEnabled(false);
            }
            if (e.getActionCommand().equals("bienPlace")||e.getActionCommand().equals("malPlace")) {
                Color colorChosen = JColorChooser.showDialog(null, "Modification de la couleur", ((JButton) e.getSource()).getBackground());
                if (Tools.isColorNotUse(player, colorChosen)) {
                    jbtSauvegarder.setEnabled(true);
                    if (e.getActionCommand().equals("bienPlace")) {                      
                        jbtColorBienPlace.setBackground(colorChosen);
                        player.setBienPlace(colorChosen);
                    }
                    if (e.getActionCommand().equals("malPlace")) {
                        jbtColorMalPlace.setBackground(colorChosen);
                        player.setBienPlace(colorChosen);
                    }
                }
            }
            if (e.getActionCommand().equals("addColor")){
            new JDialogColorSettings(player);
            }
        }

        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                jbtSauvegarder.setEnabled(true);
                if(e.getSource().equals(selectCombinaisonSize)){
                    player.setCombinaisonSize((Integer) e.getItem());
                    selectNbOccurence.setNbOccurences(player);
                    if(player.getNbOccurence()>(Integer)e.getItem()){
                        selectNbOccurence.setSelectedItem((Integer)e.getItem());                       
                    }
                    else{
                        selectNbOccurence.setSelectedItem(player.getNbOccurence());
                    }
                }
                if (e.getSource().equals(selectNbEssais)) {
                    player.setNbEssais((Integer) e.getItem());

                }
                if (e.getSource().equals(selectNbOccurence)) {
                    player.setNbOccurence((Integer) e.getItem());
                }
            }
        }
    }
}